package org.dromara.demo.designPattern.lsp.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

/**
 * 储蓄卡
 */
public class CashCard2 extends BankCard {

    private final Logger logger = LoggerFactory.getLogger(CashCard2.class);

    public CashCard2(String cardNo, String cardDate) {
        super(cardNo, cardDate);
    }

    boolean rule(BigDecimal amount) {
        return true;
    }

    /**
     * 提现
     *
     * @param orderId 单号
     * @param amount  金额
     * @return 状态码 0000成功、0001失败、0002重复
     */
    public String withdrawal(String orderId, BigDecimal amount) {
        // 模拟支付成功
        logger.info("提现成功，单号：{} 金额：{}", orderId, amount);
        return super.negative(orderId, amount);
    }

    /**
     * 充值
     *
     * @param orderId 单号
     * @param amount  金额
     * @return 状态码 0000成功、0001失败、0002重复
     */
    public String recharge(String orderId, BigDecimal amount) {
      // 模拟充值成功
        logger.info("储蓄成功，单号：{} 金额：{}", orderId, amount);
        return super.positive(orderId, amount);
    }

    /**
     * 风险校验
     *
     * @param cardNo  卡号
     * @param orderId 单号
     * @param amount  金额
     * @return 状态
     */
    public boolean checkRisk(String cardNo, String orderId, BigDecimal amount) {
      // 模拟风控校验
        logger.info("风控校验，卡号：{} 单号：{} 金额：{}", cardNo, orderId, amount);
        return true;
    }

    /**
     * 储蓄卡类中继承抽象银行卡父类 BankCard，实现的核心功能包括规则过滤
     * rule、提现withdrawal、储蓄recharge和新增的扩展方法，即风控校验
     * checkRisk。
     * 这样的实现方式满足了里氏替换的基本原则，既实现抽象类的抽象方法，
     * 又没有破坏父类中的原有方法。接下来实现信用卡的功能，信用卡的功能可以
     * 继承于储蓄卡，也可以继承抽象银行卡父类。但无论哪种实现方式，都需要遵
     * 从里氏替换原则，不可以破坏父类原有的方法。
     */


}
